/********************************************
 * 功能说明: SFTP工具类
 * 模块名称: 工具类模块
 * 系统名称: java敏捷开发通用平台
 * 软件版权:
 * 系统版本: 1.0.0
 * 开发人员: wangchong
 * 开发时间: 2018年7月19日 下午4:17:02
 * 审核人员:
 * 相关文档:
 * 修改记录: 修改日期 修改人员 修改说明
 *********************************************/
package com.hyacinth.utils.ftp;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.ChannelSftp.LsEntry;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.util.Properties;
import java.util.Vector;

/**
 * SFTP工具类
 * @author wangchong
 * @verion 1.0.0.1
 */
public class SFTPClientHelper {
	
	private static Logger log = LoggerFactory.getLogger(SFTPClientHelper.class);
	
	/**
	 * Description: s从FTP服务器下载文件
	 * @param ip sFTP服务器hostname
	 * @param port sFTP服务器端口
	 * @param username sFTP登录账号
	 * @param password sFTP登录密码
	 * @param remoteFilePath sFTP服务器文件路径(相对目录)
	 * @param localFilePath 本地文件路径
	 * @return 成功返回true，否则返回false
	 */
	public static boolean downloadFile(String ip, int port,String username, String password, String remoteFilePath, String localFilePath){
		Session session = null;
		Channel channel = null;
		ChannelSftp channelSftp = null;
		try {
			JSch jsch = new JSch();
			session = jsch.getSession(username, ip, port);
			session.setPassword(password);
			session.setTimeout(1000*10);
			Properties sshConfig = new Properties();
			//设置不用检查HostKey，设成yes，一旦计算机的密匙发生变化，就拒绝连接。
            sshConfig.put("StrictHostKeyChecking", "no");
            session.setConfig(sshConfig);
            session.connect();
            channel = session.openChannel("sftp");
            channel.connect();
            channelSftp = (ChannelSftp) channel;
            // 如果文件已存在则删除文件
            File f = new File(localFilePath);
			if(f.exists()){
				f.delete();
			}else{
				if(!f.getParentFile().exists()){
					f.getParentFile().mkdirs();
				}
			}
            //使用ChannelSftp的get(文件名，本地路径{包含文件名})方法下载文件  
           channelSftp.get(remoteFilePath, localFilePath);
           return true;
		} catch (Exception e) {
			log.error("从FTP服务器下载文件时发生异常", e);
			return false;
		} finally {
			if (channelSftp != null) {
				if (channelSftp.isClosed()) {
					channelSftp.quit();
				}
			}
			if (channel != null) {
				if (channel.isConnected()) {
					channel.disconnect();
				}
			}
			if (session != null) {
				if (session.isConnected()) {
					session.disconnect();
				}
			}
		}
	}
	
	/**
	 * Description: 判断sftp上指定文件是否存在
	 * @param ip sFTP服务器hostname
	 * @param port sFTP服务器端口
	 * @param username sFTP登录账号
	 * @param password sFTP登录密码
	 * @param remoteFilePath sFTP服务器文件路径(相对目录)
	 * @param fileName 需要查找的文件名
	 * @return 成功返回true，否则返回false
	 */
	@SuppressWarnings("unchecked")
	public static boolean isFileExit(String ip, int port, String username, String password, String remoteFilePath, String fileName){
		Session session = null;
		Channel channel = null;
		ChannelSftp channelSftp = null;
		try {
			JSch jsch = new JSch();  
			session = jsch.getSession(username, ip, port);
			session.setPassword(password);
			session.setTimeout(1000*10);
			Properties sshConfig = new Properties();
            sshConfig.put("StrictHostKeyChecking", "no");
            session.setConfig(sshConfig);
            session.connect();
            channel = session.openChannel("sftp");
            channel.connect();
            channelSftp = (ChannelSftp) channel;
            Vector<LsEntry> list = channelSftp.ls(remoteFilePath);
           for (LsEntry file : list) {
        	   if (fileName.equals(file.getFilename())) {
        		   return true;
        	   }
           }
           return false;
		} catch (Exception e) {
			log.error("从FTP服务器查找文件是否存在时发生异常", e);
			return false;
		} finally {
			if (channelSftp != null) {
				if (channelSftp.isClosed()) {
					channelSftp.quit();
				}
			}
			if (channel != null) {
				if (channel.isConnected()) {
					channel.disconnect();
				}
			}
			if (session != null) {
				if (session.isConnected()) {
					session.disconnect();
				}
			}
		}
	}
}
